Skip to content

任务计划:校园智巡 v2 升级路线图

创建时间: 2026-06-21
预计总工期: 2.5-4 周(视每日可用时间而定)
目标平台: Intel N100 Mini PC (Ubuntu 22.04),替换 Xavier NX


阶段概览

阶段 0 ──→ 阶段 1 ──→ 阶段 2 ──→ 阶段 3 ──→ 阶段 4 ──→ 阶段 5
N100 环境   FAST-LIO2   EKF集成    导航联调    鲁棒性     收尾优化
搭建与迁移  独立验证    与改造      与标定      测试       与文档
(2-3天)    (2-3天)    (2天)      (3-4天)    (2-3天)    (1-2天)

每个阶段有明确的完成标准(Done Criteria),必须全部达标才进入下一阶段。


阶段 0:N100 环境搭建与迁移(2-3 天)

目标:在 N100 上搭建完整的 ROS2 Humble 环境,迁移所有驱动和配置,确认 v1 系统(不含 FAST-LIO2)能在 N100 上正常运行。

任务 0.1:安装 ROS2 Humble

N100 已有 Ubuntu 22.04,直接原生安装:

bash
# 设置 locale
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8

# 添加 ROS2 源
sudo apt install software-properties-common
sudo add-apt-repository universe
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key \
  -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] \
  http://packages.ros.org/ros2/ubuntu jammy main" | \
  sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

# 安装
sudo apt update
sudo apt install ros-humble-desktop
sudo apt install ros-humble-navigation2 ros-humble-nav2-bringup
sudo apt install ros-humble-robot-localization
sudo apt install ros-humble-tf-transformations
sudo apt install python3-colcon-common-extensions

# 验证
source /opt/ros/humble/setup.bash
ros2 topic list

任务 0.2:迁移 workspace 源码

从 Xavier NX 或 GitHub 拉取所有 workspace:

bash
mkdir -p ~/ros2_ws/workspace && cd ~/ros2_ws/workspace

# 方式 A:从 Xavier NX 直接 scp
scp -r iot@<xavier_ip>:/ros2_ws/workspace/myslam_car .
scp -r iot@<xavier_ip>:/ros2_ws/workspace/livox .
scp -r iot@<xavier_ip>:/ros2_ws/workspace/rtk_um982 .
scp -r iot@<xavier_ip>:/ros2_ws/workspace/spatio_temporal .
scp -r iot@<xavier_ip>:/ros2_ws/workspace/carplanning_code .

# 方式 B:从 GitHub 克隆(如果都推过远程)
git clone <url> carplanning_code && cd carplanning_code && git checkout hardware
# ... 其他 workspace

任务 0.3:编译所有 workspace

bash
source /opt/ros/humble/setup.bash

# 按依赖顺序编译
cd ~/ros2_ws/workspace/livox && colcon build
cd ~/ros2_ws/workspace/myslam_car && colcon build
cd ~/ros2_ws/workspace/rtk_um982 && colcon build
cd ~/ros2_ws/workspace/spatio_temporal && colcon build

# 主包
cd ~/ros2_ws/workspace/carplanning_code
source ~/ros2_ws/workspace/livox/install/setup.bash
source ~/ros2_ws/workspace/myslam_car/install/setup.bash
source ~/ros2_ws/workspace/rtk_um982/install/setup.bash
source ~/ros2_ws/workspace/spatio_temporal/install/setup.bash
colcon build --packages-select carplanning_code

注意:在 x86 上编译这些包应该比 ARM 顺利得多。如果有编译错误,大概率是缺少 apt 依赖,按报错信息 sudo apt install 即可。STVL 在 Xavier NX 上曾有 ARM 编译问题,在 x86 上不会有。

任务 0.4:硬件接线与 udev 规则

把 USB 设备从 Xavier NX 拔下来接到 N100:

bash
# 查看 USB 设备
lsusb
ls /dev/ttyUSB*  # 或 /dev/ttyACM*

# 获取设备 serial ID
udevadm info -a /dev/ttyUSB0 | grep serial

# 创建 udev 规则(根据实际 serial ID 修改)
sudo tee /etc/udev/rules.d/99-robot.rules << 'EOF'
# UM982 RTK GPS
SUBSYSTEM=="tty", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="XXXX", \
  ATTRS{serial}=="XXXXXXXX", SYMLINK+="rtk1", MODE="0666"

# STM32 底盘控制器
SUBSYSTEM=="tty", ATTRS{idVendor}=="XXXX", ATTRS{idProduct}=="XXXX", \
  ATTRS{serial}=="XXXXXXXX", SYMLINK+="stm32", MODE="0666"
EOF

sudo udevadm control --reload-rules
sudo udevadm trigger

# 验证
ls -la /dev/rtk1 /dev/stm32

任务 0.5:配置 Livox 以太网

N100 的以太网口需要配置静态 IP 与 Livox Mid-360 通信:

bash
# 方式 A:nmcli(推荐)
sudo nmcli con add type ethernet ifname <eth_interface> con-name livox \
  ipv4.addresses 192.168.1.50/24 ipv4.method manual

# 方式 B:netplan(如果用 netplan)
# 编辑 /etc/netplan/01-livox.yaml

验证:

bash
ping 192.168.1.140  # Livox 默认 IP
# 如果能 ping 通,说明网络配置正确

任务 0.6:v1 全栈启动测试

在 N100 上启动 v1 的全部系统(不含 FAST-LIO2),确认所有传感器和导航正常:

bash
ros2 launch carplanning_code bringup.launch.py

检查:

  • 底盘驱动:ros2 topic hz /odom 显示 10Hz
  • IMU:ros2 topic hz /imu/data_raw 显示 10Hz
  • LiDAR:ros2 topic hz /livox/lidar 显示 10Hz
  • GPS:ros2 topic hz /gps/fix 显示 10-20Hz
  • EKF:ros2 topic hz /odometry/filtered 正常输出
  • Nav2:ros2 topic list | grep -c nav 显示多个 Nav2 话题
  • GPS 监控:python3 scripts/gps_monitor_v2.py --no-csv 显示 RTK_FIXED
  • CPU 占用:htop 确认总 CPU < 80%

阶段 0 完成标准

  • ROS2 Humble 原生安装在 N100 上
  • 所有 workspace 编译通过
  • USB 设备(GPS、底盘)正确绑定
  • Livox 以太网通信正常
  • v1 全栈可以在 N100 上正常启动和运行
  • CPU 使用率有明显余量(< 80%)

阶段 1:FAST-LIO2 独立编译与验证(2-3 天)

目标:确认 FAST-LIO2 能在 N100 上跑起来,正确订阅 Livox Mid-360 和 IMU,输出合理的里程计数据。这个阶段不碰 EKF 和 Nav2。

任务 1.1:选择 ROS2 Humble 移植版本

搜索 GitHub 上 FAST-LIO2 的 ROS2 Humble 移植版,筛选标准:

  • 明确支持 ROS2 Humble
  • 有 Livox 点云格式支持(livox_ros_driver2 兼容)
  • 有近期维护(最近 6 个月内有 commit)
  • 在 x86 Ubuntu 22.04 上验证过

任务 1.2:编译

bash
# 安装依赖
sudo apt install libeigen3-dev libpcl-dev ros-humble-pcl-conversions

cd ~/ros2_ws/workspace
git clone <选定的仓> fast_lio2
cd fast_lio2
source /opt/ros/humble/setup.bash
source ~/ros2_ws/workspace/livox/install/setup.bash
colcon build --packages-select fast_lio

x86 平台上编译应该不会遇到 ARM 特有的问题。如果有报错,通常就是缺少 apt 依赖。

任务 1.3:配置 Livox Mid-360 参数

创建 FAST-LIO2 的 YAML 配置文件,设置:

  • lidar_type: Livox
  • 点云话题: /livox/lidar
  • IMU 话题: /imu/data_raw
  • LiDAR-IMU 外参初始值: 平移 [0.14, 0.0, 0.12]
  • IMU 噪声参数: 底盘 MEMS 典型值

任务 1.4:室外静态测试

不启动 Nav2 和 EKF,只启动底盘 + Livox + FAST-LIO2:

bash
# 终端 1
ros2 launch myslam_car driver.launch.py

# 终端 2
ros2 launch carplanning_code mid360.launch.py

# 终端 3
ros2 launch fast_lio mapping.launch.py

检查项:

  • FAST-LIO2 启动无 crash
  • ros2 topic hz /lio_odom 显示 ~10Hz
  • 静止时位置漂移 < 5cm/分钟
  • 静止时 yaw 漂移 < 1°/分钟
  • htop 确认 FAST-LIO2 CPU 占用 < 40%

任务 1.5:室外动态测试

手动遥控机器人走 5m × 5m 矩形路径,回到起点:

  • 终点与起点位置误差 < 20cm
  • 直线行驶轨迹不弯曲
  • 转弯 90° 时 yaw 变化约 90°

如果 10Hz IMU 导致效果不佳

  • 选项 A:外接独立 IMU(BNO055 USB, 100Hz)
  • 选项 B:修改底盘驱动提高 IMU 发布频率
  • 选项 C:放弃 FAST-LIO2,换用 KISS-ICP(不需要 IMU)

阶段 1 完成标准

  • FAST-LIO2 编译通过并可运行
  • 静止:1 分钟漂移 < 5cm + yaw < 1°
  • 动态:5m×5m 矩形闭环误差 < 20cm
  • CPU 占用可接受
  • 输出 Odometry 消息格式确认

阶段 2:EKF 集成与改造(2 天)

目标:把 FAST-LIO2 接入 EKF,替代轮式里程计,与 RTK-GPS 融合。

任务 2.1:修改 ekf.yaml

yaml
# odom0: 轮式里程计 → FAST-LIO2
odom0: /lio_odom
odom0_config: [false,false,false, false,false,false,
               true, true, false, false,false,true,
               false,false,false]

# 移除 imu0(已在 FAST-LIO2 内部融合)

# odom1: GPS 保持不变
odom1: /odometry/gps

# 频率提高
frequency: 10.0
sensor_timeout: 0.3

任务 2.2:修改 bringup.launch.py

  • t=3s 添加 FAST-LIO2 启动
  • EKF 延迟到 t=6s
  • 决定是否保留 covariance_relay.py

任务 2.3:TF 冲突排查

  • 确认 FAST-LIO2 配置为不发布 TF
  • ros2 run tf2_tools view_frames 检查 TF 树

任务 2.4:融合效果验证

启动定位全栈(不启动 Nav2),手动遥控:

  • EKF 输出 ≥ 10Hz
  • TF 树正确
  • RViz 中运动方向与真实世界一致
  • 无 "Failed to meet update rate" 警告

阶段 2 完成标准

  • EKF 稳定融合 LIO + GPS
  • TF 树无冲突
  • 手动遥控时 RViz 表现正确
  • 静止时位置稳定

阶段 3:导航联调与标定(3-4 天)

目标:接入 Nav2 全栈,完整导航测试。

任务 3.1:Nav2 频率调整

N100 算力更充足,可以适当提高:

yaml
controller_frequency: 15.0      # 10→15Hz
transform_tolerance: 0.3        # 0.5→0.3s

任务 3.2:yaw_offset 标定

让机器人面朝已知方向,检查 RViz 中 map 坐标系方向是否正确,调整 yaw_offset

任务 3.3:短距离导航测试(5m)

  • 路径规划正确
  • 机器人沿路径行驶,不振荡
  • 到达目标误差 < 0.5m
  • 代价地图不旋转

任务 3.4:中距离导航测试(20m)

  • 遇障碍物时重新规划
  • 绕障后回到正确路径
  • 不原地打转
  • 不进入 recovery 循环

任务 3.5:DWB 参数调优

如果跟踪不满意,调整 PathAlign/GoalAlign/PathDist/GoalDist 权重。

阶段 3 完成标准

  • 5m 导航:成功到达,跟踪误差 < 30cm
  • 20m 导航:成功到达,能避障
  • 代价地图方向正确
  • 无 recovery 循环

阶段 4:鲁棒性测试(2-3 天)

目标:验证 GPS 降级、复杂环境等非理想条件下的表现。

任务 4.1:GPS 降级测试

导航过程中断开 NTRIP,观察:

  • GPS 降级瞬间不剧烈跳动
  • 导航继续工作 ≥ 2 分钟
  • GPS 恢复后自动修正

任务 4.2:GPS 完全丢失测试

关闭 GPS 驱动,记录纯 LIO 模式下的持续时间和精度。

任务 4.3:复杂环境导航

多障碍物、拐角、窄通道测试。

任务 4.4:长时间运行(30 分钟+)

  • 内存稳定(ikd-Tree 无泄漏)
  • CPU 稳定
  • 导航精度不随时间下降

阶段 4 完成标准

  • GPS 降级可工作 ≥ 2 分钟
  • 复杂环境成功率 ≥ 70%
  • 30 分钟无 crash

阶段 5:收尾(1-2 天)

任务 5.1:参数固化与备份

任务 5.2:监控工具更新

  • ekf_probe.py 添加 /lio_odom 监控
  • 考虑添加 FAST-LIO2 健康检查

任务 5.3:文档更新

  • CLAUDE.mdREADME.md
  • 已知问题和调优记录

任务 5.4:Git 管理

  • 所有变更提交到 hardware 分支
  • 创建 v2 tag

阶段 5 完成标准

  • 一键启动全栈
  • 文档完整
  • Git 提交整洁

风险与备选方案

风险概率影响备选方案
FAST-LIO2 ROS2 Humble 编译失败(x86 比 ARM 容易很多)尝试其他 fork;或用 KISS-ICP 替代
底盘 10Hz IMU 不够 FAST-LIO2 使用换 KISS-ICP(不需要 IMU);或加独立 IMU
N100 算力不够跑全栈(v1 在 Xavier NX 上都能跑)降低 FAST-LIO2 点云密度;或降低 Nav2 频率
LiDAR-IMU 外参标定困难手动测量 + 迭代调整;或用 LI-Init 工具
N100 供电问题确认 DC-DC 模块输出稳定 12V

需要修改的文件清单

文件改动内容阶段
config/ekf.yamlodom0→LIO,移除 imu0,频率→10Hz阶段 2
config/nav2_params.yaml提高频率、收紧 transform_tolerance阶段 3
launch/bringup.launch.py添加 FAST-LIO2,调整时序阶段 2
config/fastlio2.yaml (新)FAST-LIO2 配置阶段 1
/etc/udev/rules.d/99-robot.rulesN100 的 USB 设备绑定阶段 0
scripts/ekf_probe.py添加 /lio_odom 监控阶段 5
CLAUDE.md更新架构描述阶段 5

每日建议节奏

如果每天有 3-4 小时可用时间:

  • 第 1-3 天:阶段 0(ROS2 安装、编译、接线、v1 验证)
  • 第 4-5 天:阶段 1 前半(FAST-LIO2 编译、配置)
  • 第 6-7 天:阶段 1 后半(室外静态/动态测试)
  • 第 8-9 天:阶段 2(EKF 集成、TF 排查)
  • 第 10-13 天:阶段 3(导航联调、标定、参数调优)
  • 第 14-16 天:阶段 4(鲁棒性测试)
  • 第 17-18 天:阶段 5(收尾)
最近更新